package com.lvhr.rpc.registry;

import com.lvhr.rpc.spi.SpiLoader;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 注册中心工厂（用于获取注册中心对象，支持SPI动态加载 + 懒汉式单例）
 *
 */
public class RegistryFactory {

    // 单例实例缓存（Key: 注册中心类型, Value: 注册中心实例）
    private static final ConcurrentHashMap<String, Registry> INSTANCE_CACHE = new ConcurrentHashMap<>();

    // 默认注册中心类型（可配置化扩展）
    private static final String DEFAULT_REGISTRY_TYPE = "etcd"; // 假设默认是etcd，具体根据需求调整

//    static {
//        // 静态代码块中可以预先加载所有可用的注册中心实现
//         //SpiLoader.load(Registry.class);
//    }

    /**
     * 获取注册中心实例（懒加载 + 线程安全）
     *
     * @param key 注册中心类型
     * @return 注册中心实例，永不为null
     * @throws IllegalArgumentException 类型不存在时抛出
     */
    public static Registry getInstance(String key) {
        // 参数校验
        if (key == null || key.isEmpty()) {
            key = DEFAULT_REGISTRY_TYPE;
        }

        // 双重校验锁实现懒加载
        return INSTANCE_CACHE.computeIfAbsent(key, t -> {
            synchronized (RegistryFactory.class) {
                // 再次检查防止其他线程已创建
                if (INSTANCE_CACHE.containsKey(t)) {
                    return INSTANCE_CACHE.get(t);
                }

                // 通过 SPI 加载实例
                Registry instance = SpiLoader.getInstance(Registry.class, t);
                if (instance == null) {
                    throw new IllegalArgumentException("Unsupported registry type: " + t);
                }
                return instance;
            }
        });
    }

    /**
     * 获取默认注册中心实例
     */
    public static Registry getDefaultInstance() {
        return getInstance(DEFAULT_REGISTRY_TYPE);
    }
}

